package pharao.client.views.game.landkarte.ort.exam;

import java.util.Iterator;

import pharao.client.dto.AufgabenStatusDTO;
import pharao.client.dto.ExamenStatusDTO;
import pharao.client.dto.OrtStatusDTO;
import pharao.client.views.game.landkarte.ort.basics.events.GetOrtStatusEvent;
import pharao.client.views.game.landkarte.ort.basics.events.SetOrtStatusEvent;
import pharao.client.views.game.landkarte.ort.exam.events.AddExamenStatusDTOEvent;
import pharao.client.views.game.landkarte.ort.exam.events.CheckExamenStatusEvent;
import pharao.client.views.game.landkarte.ort.exam.events.ExamNotAvailAbleEvent;
import pharao.client.views.game.landkarte.ort.exam.events.GetExamenEvent;
import hmvc4gwt.client.event.IHmvcEvent;
import hmvc4gwt.framework.client.model.GuiModel;

public class ExamModel extends GuiModel {

	private static byte minAufgabenSize = 1;
	
	private static float startExamPercent = 0.66f;
	
	private OrtStatusDTO ortStatusDTO;
	
	/**
	 * prüft ob die Prüfung schon stattfinden kann
	 */
	private void checkOrtStatus() {
		
		int all = ortStatusDTO.getListAufgabeStatus().size();
		
		/*
		 * Mindestens 20 Aufgaben mussten gerechnet werden
		 */
		if (all < minAufgabenSize) {
			showMoreTraining();
			return;
		}
		
		int start = all - minAufgabenSize;
		int cnt = 1;
		int passend = 0;
		
		Iterator iterator = ortStatusDTO.getListAufgabeStatus().iterator();
		while (iterator.hasNext()) {
			
			AufgabenStatusDTO aufgabenStatusDTO = (AufgabenStatusDTO) iterator.next();
			
			if ((cnt >= start) && (cnt <= all)) {
				if (aufgabenStatusDTO.isPassed()) {
					passend++;
				}
			}
			
			cnt++;
		}
		
		float result = passend / minAufgabenSize;
		
		if (result > startExamPercent) {
			showStart();
		} else {
			showMoreTraining();
		}
		
	}

	public void pre() {
		getController().register(CheckExamenStatusEvent.class, this);
		getController().register(SetOrtStatusEvent.class, this);
		getController().register(AddExamenStatusDTOEvent.class, this);
	}
	
	public void init() {
		getController().fireEventUp(new GetOrtStatusEvent());
	}

	private OrtStatusDTO getOrtStatusDTO() {
		return ortStatusDTO;
	}

	public void handleEvent(IHmvcEvent event) {
		if (event instanceof SetOrtStatusEvent) {
			setOrtStatusDTO((OrtStatusDTO) event.getPayload()); 
		} else if (event instanceof AddExamenStatusDTOEvent) {
			getOrtStatusDTO().addExamenStatusDTO((ExamenStatusDTO) event.getPayload());
		} else if (event instanceof CheckExamenStatusEvent) {
			checkOrtStatus();
		}
	}

	private void setOrtStatusDTO(OrtStatusDTO ortStatusDTO) {
		this.ortStatusDTO = ortStatusDTO;
	}

	private void showMoreTraining() {
		getController().fireEventLocal(new ExamNotAvailAbleEvent());
	}

	private void showStart() {
		getController().fireEventUp(new GetExamenEvent());
	}

	public void terminate() {
		// TODO Auto-generated method stub

	}

}
